#ifndef BLKALLOC_H
#define BLKALLOC_H

#include "types.h"

typedef struct
{
    u8 taken;
    u32 start;
    u32 size;
    char tag[16];
} Block;

typedef struct
{
    Block *blocks;
    u8 numblocks;
    char *name;
    u32 start, end;
} BlkAlloc;

void blkAlloc_init(BlkAlloc *alloc, u32 start, u32 size, char *name);
void blkAlloc_shutdown(BlkAlloc *alloc);
u32 blkAlloc_alloc(BlkAlloc *alloc, u32 size, u8 fromEnd, const char *tag, u8 empty);
u32 blkAlloc_allocAt(BlkAlloc *alloc, u32 address, u32 size, const char *tag, u8 empty);
void blkAlloc_free(BlkAlloc *alloc, u32 position);
Block *blkAlloc_getBlkFromAddr(BlkAlloc *alloc, u32 addr);
u32 blkAlloc_getMaxBlk(BlkAlloc *alloc);
u32 blkAlloc_getFreeSize(BlkAlloc *alloc);
u8 blkAlloc_addrInBlock(BlkAlloc *alloc, u32 address);
void blkAlloc_listBlocks(BlkAlloc *alloc);

#endif
